某银行有人命币储蓄业务,有 n 个柜员负责,有 1 台取号机和一台叫号机。每个顾客进入银行之后先取一个号,若有人取号必须等这个人取完号才能取号,取到号的人就等待叫号。当一个柜员人员空闲下来,就叫下一个号,试用 P、V 操作编写柜台人员和顾客进程的程序。
semaphore fmutex=1; 互斥信号量,取号机
semaphore cmutex=1; 互斥信号量,叫号机
semaphore full=0; 等待被叫号的数量
semaphore sell=n; 记录是否有空闲的柜员
void customer()
{
while(true)
{
P(fmutex);
//取号;
V(fmutex);
V(full);
//等待叫号
P(sell);
//办理业务;
}
}
void seller()
{
while(true)
{
P(full);
P(cmutex);
//叫号
V(cmutex);
//服务
V(sell);
}
}